package utils;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

import domain.Music;
import exception.FormatException;
/**
 * @author Administrator
 *	SpringMVC里面已经处理好了这个
 *	不过复习了下原生的也可以  用这种方法得不到token
 */
public class FileUtil {

	public static Music upload(HttpServletRequest req /*Map<String,String> map*/, String tokenInSession) {
		boolean isMultipart = ServletFileUpload.isMultipartContent(req);
		if (!isMultipart) {
			return null;
		}

		//先创建一个对象  这样就写死了 ，以后再来优化吧
		Music music = new Music();

		//FileItem是表单控件的封装
		//创建 FileItem工厂 。               构造器里面可以传入 缓存大小（1024*10）和 缓存目录（temp）
		FileItemFactory factory = new DiskFileItemFactory(1024,null);
		//将创建工厂组合到upload（文件上传处理器）里面去
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setFileSizeMax(1024 * 1024 * 15); //设置单个文件大小15M 超过用异常捕获包装
		//		upload.setSizeMax(1024);   设置请求大小限制
		//设置上传文件类型
		String[] mime = { "mp3", "ogg", "wav", "wma" ,""};
		List<String> mimes = Arrays.asList(mime);
		//解析请求
		String uuidName = null; //生成的uuid名
		String end = null; //后缀名
		try {
			List<FileItem> list = upload.parseRequest(req);
			//System.out.println(list);
			for (FileItem fieldItem : list) {
				//表单控件的属性名
				//其实这些属性放在外面做简单点 让这个Util返回一个路径就可以了  。（瞎扯淡）
				//或者路径也直接由Controller传过来也不会耦合性这么高这里主要为了熟悉下自己以前的代码。。。。（瞎说）
				if (fieldItem.isFormField()) {
					//防止表单的重复提交
					if ("tokenInForm".equals(fieldItem.getFieldName())
							&& !fieldItem.getString("UTF-8").equals(tokenInSession)) {
							return null;
					}
					if ("name".equals(fieldItem.getFieldName())) {
						music.setName(fieldItem.getString("UTF-8"));
					}
					if ("desc".equals(fieldItem.getFieldName())) {
						music.setDescript(fieldItem.getString("UTF-8"));
					}
				} else {
					//非普通表单控件
					String wenjian = fieldItem.getName();
					//获取文件后缀名判断是否是设置的类型
					end = FilenameUtils.getExtension(wenjian);
					if (!mimes.contains(end)) {
						throw new FormatException("请上传正确的文件格式");
					}
					//给该文件名创建UUID 确保唯一性
					uuidName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(wenjian);
					//得到绝对路径  不用加上下文路径  出现问题了 这里得到的 路径是默认的 缓存路径好像是
					//D:\JavaDemo\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\BlogSpace\music
					//String dir = req.getServletContext().getRealPath("/music");
					//这里得到的是服务器上的路径，不是磁盘的物理路径
					String dir=req.getSession().getServletContext().getRealPath("/music");
					//System.out.println(dir);
					//String dir = "D:/JavaDemo/BlogSpace/src/main/webapp/music";
					//上传控件
					//System.out.println(dir);
					fieldItem.write(new File(dir, uuidName));
					music.setRealPath("/BlogSpace/music/" + uuidName);
				}
			}
		} catch (FormatException e) {
			throw new FormatException("文件格式错误", e);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return music;
	}
}
